package org.cainiao.notebook.entity;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Transient;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.cainiao.common.constant.ICodeBook;
import org.cainiao.common.entity.IdBaseEntity;

import java.io.Serial;
import java.util.List;

/**
 * <br />
 * <p>
 * Author: Cai Niao(wdhlzd@163.com)<br />
 */
@Entity(name = "t_note")
@NoArgsConstructor
@SuperBuilder
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(name = "Note", description = "笔记")
public class Note extends IdBaseEntity {

    /**
     * 顶级笔记 ID，是一个虚拟节点，parentId 为 TOP_ID 的节点实际上是根节点
     */
    public static final long TOP_ID = -1;

    @Serial
    private static final long serialVersionUID = -5186284820110924015L;

    /**
     * 用户在这个系统中的唯一标识<br />
     * 系统内的资源应该以这个 ID 来标识资源由哪个用户所有，而不是用平台用户ID<br />
     * 已达到用户ID在系统间隔离的目的（类似飞书的open_id，只是飞书的open_id时应用级别的，而【系统用户 DI】时系统级别的）
     */
    @Column(name = "not_system_user_id", nullable = false)
    private String systemUserId;

    /**
     * 父节点ID
     */
    @Column(name = "not_parent_id", nullable = false)
    private long parentId;

    /**
     * 笔记类型
     */
    @Column(name = "not_type", nullable = false)
    private TypeEnum type;

    /**
     * 外部 ID<br />
     * 当数据需要从外部获取时，记录获取外部数据需要的 ID<br />
     * 例如飞书文档或飞书文件夹的 Token
     */
    @Column(name = "not_external_id")
    private String externalId;

    /**
     * 笔记名称
     */
    @Column(name = "not_name")
    private String name;

    /**
     * 子节点<br />
     * 无论是飞书文档还是飞书文件夹，在菜鸟笔记的数据库中都是叶子节点<br />
     * 飞书的子节点都通过飞书 API 获取，在前端缓存
     */
    @Transient
    private List<Note> children;

    public enum TypeEnum implements ICodeBook {
        NORMAL("普通笔记", "普通笔记"),
        LARK_DOCUMENT("飞书文档笔记", "一种笔记类型，通过同步飞书文档获取数据"),
        LARK_FOLDER("飞书文件夹笔记", "一种笔记类型，通过同步飞书文件夹获取数据");

        private final String name;
        private final String description;

        TypeEnum(String name, String description) {
            this.name = name;
            this.description = description;
        }

        @Override
        public String getName() {
            return this.name;
        }

        @Override
        public String getDescription() {
            return this.description;
        }
    }
}
